Java 如何判断两个浮点数是否相等?

您所在的位置:网站首页 java double判断null Java 如何判断两个浮点数是否相等?

Java 如何判断两个浮点数是否相等?

2024-07-11 06:09:33| 来源: 网络整理| 查看: 265

转载自https://blog.csdn.net/bupa900318/article/details/80553695

 

在Java中int类型数据的大小比较可以使用 == ,double类型则不能使用 == 来比较大小,如果使用的话得到的结果将永远是不相等,即使两者的精度是相同的也不可以。

背景知识

float型和double型是JAVA的基本类型,用于浮点数表示,在JAVA中float型占4个字节32位,double型占8个字节64位,一般比较适合用于工程测量计算中,其在内存里的存储结构如下:

float型:  符号位(1 bit)  指数(8 bit)  尾数(23 bit)  double型:  符号位(1 bit)  指数(11 bit)  尾数(52 bit)  注意:从左到右是从低位到高位,而在计算机内部是采用逆序存储的。 

JAVA中float型和double型是不能被计算机精确存储的。以double类型数据1.10举例计算机如何将浮点型数据转换成二进制存储:  整数部分:1,转换成二进制1

小数部分:0.1  0.1*2=0.2取整数部分0,基数=0.2  0.2*2=0.4取整数部分0,基数=0.4  0.4*2=0.8取整数部分0,基数=0.8  0.8*2=1.6取整数部分1,基数=1.6-1=0.6  0.6*2=1.2取整数部分1,基数=1.2-1=0.2  0.2*2=0.4取整数部分0,基数=0.4  ···

直至基数为0。

1.1用二进制表示为:1.000110……,即0.1 = 0*2^(-1)+0*2^(-2)+0*2^(-3)+1*2^(-4)+……而double型的小数部分只有52位,当向后计算 52位后基数还不为0时,后面的部分只能舍弃,从这里可以看出float型、double型并不能准确表示每一位小数。

因此。程序中应尽量避免浮点数的比较。在循环中,检测两个浮点数是否相等需要格外小心,如下的for循环可能永远不会结束:

for(double i = 0; i != 10; i += 0.1);

浮点数能表示的精度是有限的,在计算过程中不可避免的会出现截尾而损失精度,所以如果要判断一个浮点数double_x是否等于0,用double_x == 0这样的判断是不合适的,如果double_x是一系列计算的结果或者是外部传感器的输入值,那么它几乎不可能是0,它大概率是一个接近0的小数,比如0.000002,

比较double数据是否相等的方法

方法一:若精度要求不高,比如因为传感器有误差,小于0.001的数都可以认为等于0,那么就定义epsilon = 0.001:

final double epsilon = 0.001; double double_x = 0.0; if(Math.abs(double_x - 0) < epsilon) {     System.out.println("true"); }

方法二:转换成字符串之后用equals方法比较 

如果要比较的两个double数据的字符串精度相等,可以将数据转换成String然后借助String的equals方法来间接实现比较两个double数据是否相等。

Double.toString(double_x).equals(Double.toString(double_y))

注意:这种方法只适用于比较精度相同的数据,并且是只用用于比较是否相等的情况下,不能用来判断大小。

方法三:转换成Long之后用==方法比较

使用Sun提供的Double.doubleToLongBits()方法,该方法可以将double转换成long型数据,从而可以使double按照long的方法(, ==)判断是否大小和是否相等。

Double.doubleToLongBits(0.01) == Double.doubleToLongBits(0.01) Double.doubleToLongBits(0.02) > Double.doubleToLongBits(0.01) Double.doubleToLongBits(0.02) < Double.doubleToLongBits(0.01)

方法四:使用BigDecimal类型的equals方法或compareTo方法

类加载:

import java.math.BigDecimal;

使用字符串形式的float型和double型构造BigDecimal:BigDecimal(String val)。BigDecimal的euquals方法是先判断要比较的数据类型,如果对象类型一致前提下同时判断精确度(scale)和值是否一致;compareTo方法则不会比较精确度,把精确度低的那个对象转换为高精确度,只比较数值的大小。

System.out.println(new BigDecimal("1.2").equals(new BigDecimal("1.20"))); //输出false System.out.println(new BigDecimal("1.2").compareTo(new BigDecimal("1.20")) == 0); //输出true System.out.println(new BigDecimal(1.2).equals(new BigDecimal("1.20"))); //输出false System.out.println(new BigDecimal(1.2).compareTo(new BigDecimal("1.20")) == 0); //输出false System.out.println(new BigDecimal(1.2).equals(new BigDecimal(1.20))); //输出true System.out.println(new BigDecimal(1.2).compareTo(new BigDecimal(1.20)) == 0);//输出true

 



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭